{
 "metadata": {
  "name": "",
  "signature": "sha256:07f88d8441991e78a7ba1931746df1485d852cea03b85ccda985a267bf888983"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "On the road to a geometric understanding of conditional expectation, we need to grasp the concept of projection. In the figure below, we want to find a point along the blue line that is closest to the red square. In other words, we want to inflate the pink circle until it just touches the blue line. Then, that point will be the closest point on the blue line to the red square."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from __future__ import division\n",
      "from matplotlib import  patches\n",
      "\n",
      "fig, ax = subplots()\n",
      "fig.set_figheight(5)\n",
      "x = arange(6)\n",
      "y= matrix([[2],\n",
      "           [3]])\n",
      "ax.plot(x,x)\n",
      "ax.plot(*y,marker='s',color='r')\n",
      "ax.add_patch(patches.Circle(y,radius=.5,alpha=0.75,color='pink'))\n",
      "ax.annotate('Find point along\\n line closest\\n to red square',\n",
      "            fontsize=12,xy=(2.5,2.5),\n",
      "            xytext=(3,1.5),\n",
      "            arrowprops={'facecolor':'blue'})\n",
      "ax.axis(xmax=5,ymax=5)\n",
      "ax.set_aspect(1)\n",
      "ax.grid()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "iVBORw0KGgoAAAANSUhEUgAAATEAAAE4CAYAAAAzasSgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3X1cVHW+B/DPzIAK8iyKPCmG+YCacGPF50DLrCRNrfVh\nSzNrd29Zau3VbmZarZulWba99nUzVzfdzOu25UNmdVVaV3PZTCyfUhIIAUWQFAGBmfndP45MoANz\nGObMeZjP+/XiVeOcOfP7zsCH3/lyzm9MQggBIiKdMqs9ACKitmCIEZGuMcSISNcYYkSkawwxItI1\nhhgR6ZqfnI0SEhIQEhICi8UCf39/ZGdnKz0uIiJZZIWYyWRCVlYWIiIilB4PEVGryD6c5DmxRKRF\nskLMZDLh9ttvR2pqKtasWaP0mIiIZJN1OLl//35ER0fjwoULuOOOO9CnTx+MGDFC6bEREbkkK8Si\no6MBAJ07d8Z9992H7OxsR4jFxsaiuLhYuRESkU9KTExEbm6uy+1cHk5WV1ejsrISAFBVVYXPP/8c\nAwYMcNxfXFwMIYRhv1544QXVx8D6WJ+v1Hf+vEC/fgKLFwv88MMPssLOZYidP38eI0aMQHJyMtLS\n0jBu3DiMGTNG1s6NID8/X+0hKIr16ZuR6istBUaNAiZNApYskf84l4eTPXr0QE5OThuGRkTUsusD\nzGSS/1iese/CzJkz1R6ColifvhmhvrYEGACYhBBtOgHMZDKhjbsgIh/VUoDJzRbOxFzIyspSewiK\nYn36puf62joDa8AQIyKv81SAATycJCIvkxtgPJwkIs3x5AysAUPMBT33HORgffqmp/qUCDCAIUZE\nXqBUgAHsiRGRwtwNMPbEiEh1Ss7AGjDEXNBTz8EdrE/ftFyfNwIMYIgRkQK8FWAAe2JE5GGeCjD2\nxIjI67w5A2vAEHNByz0HT2B9+qal+tQIMIAhRkQeoFaAAeyJEVEbKRVg7IkRkeLUnIE1YIi5oKWe\ngxJYn76pWZ8WAgxgiBGRG7QSYAB7YkTUSt4KMPbEiMjjtDQDa8AQc4E9FX1jfZ6jxQADGGJEJINW\nAwxgT4yIXFArwNgTI6I20/IMrAFDzAX2VPSN9blPDwEGMMSIyAm9BBjAnhgRXUcrAcaeGBG1mlYC\nrDUYYi6wp6JvrE8+PQYYwBAjIug3wAD2xIh8nlYDjD0xInJJqwHWGgwxF9hT0TfW1zwjBBjAECPy\nSUYJMIA9MSKfo5cAY0+MiG6glwBrDYaYC+yp6Bvr+5kRAwxgiBH5BKMGGMCeGJHh6TXA2BMjIt0G\nWGswxFxgT0XffLk+XwgwgCFGZEi+EmAAe2JEhmOUAGNPjMgHGSXAWoMh5oIv91SMwJfq88UAA2SG\nmM1mQ0pKCjIzM5UeDxG5wVcDDJDZE3v99ddx6NAhVFZWYtu2bU13wJ4YkaqMGmAe64mdPXsWO3fu\nxOzZsxlWRBpj1ABrDZchNm/ePLz22mswm32zfeZLPRUjMnJ9paVAWlqWTwcY4CLEduzYgS5duiAl\nJYWzMCINaZiBjRzp2wEGAH4t3XngwAFs27YNO3fuxNWrV3H58mU89NBDeO+995psN3PmTCQkJAAA\nwsLCkJycjPT0dAA//ybU6+2Gf9PKeFgf66uoAJ5/Ph2TJgHp6cCXXxqjvqysLKxfvx4AHHkih+yT\nXb/88kusWLEC27dvb7oDNvaJvMaXemCKnOxqMvIr1oyG3xRGxfr0w1mAGak+d7V4ONnYbbfdhttu\nu03JsRBRM3xpBtZavHaSSON8NcB47SSRAfhqgLUGQ8wFo/ccWJ92yQkwPdfnKQwxIg3iDEw+9sSI\nNIYBJmFPjEiHGGCtxxBzweg9B9anHe4EmJ7qUwpDjEgDOANzH3tiRCpjgDnHnhiRDjDA2o4h5oLR\new6sTz2eCDAt1+ctDDEiFXAG5jnsiRF5GQNMHvbEiDSIAeZ5DDEXjN5zYH3eo0SAaak+tTDEiLyA\nMzDlsCdGpDAGmHvYEyPSAAaY8hhiLhi958D6lOONADP6+ycHQ4xIAZyBeQ97YkQexgDzDPbEiFTA\nAPM+hpgLRu85sD7PUSPAjP7+ySH7cydJp4QAauuAmlqgqhqorJb+X9gBuwBO5gFBnQGzCWjXDggO\nBIICgYAOQId2gJm/5+TgDEw97IkZkRDAlWrgfDlwqRIQjf7dbAZMZsDZD5ndLn01/gnsGAB0jQRC\ngxhozWCAKUNutjDEjMRqAy5eAs6VAXX10r9ZLO7/VAkB2GwAhLSfqE5AZDjQzt9jQ9Y7Bphy2Nj3\nEF30HOx24Ow5IOckUFAM1Ful0PHzc/lTlfX1v5q/02SS9uHnL83mikqBb08BPxRKz6EDSr5/Wggw\nXXx/Kow9Mb27Ug2cOSv1vWSEltvMZulLCKDiEnDpCpAQA4SH+OT0QwsBRhIeTuqV3S7NjM6V/Txj\n8iabHbDbpBDrHgP4+87vQwaYd7AnZmRXa4FTBcrPvlwRArBZAbMF6NkNCOmozji8iAHmPeyJeYjm\neg7VV4ETZ6TGvb9/m3+KWuyJuWIyXeuXCeBUPlBxuU1jUYIn3z8tBpjmvj9VwBDTk6oa4OQZ6VDO\n24ePLbFYpNM2cn+U/jpqQFoMMJLwcFIvamqlGZhdAH4WtUfjnN0uBWyv7tJ5ZQbBAFMHDyeNpN4K\nfJ8nhYRWAwz4+S+Ypwukw14DYIBpH0PMBU30HH4skYJMgUPINvXEnLFc+5Y6c1YKXZW15f3TQ4Bp\n4vtTZQwxrfvpstRn0lIPzBWLBai5CpSUqT0St+khwEjCnpiW1VuBo6elPphFw4eRztiFdB5ZUiIQ\n2EHt0bQKA0wb2BMzgh9LpOsh9RZggLQqBqCZw0q5GGD6wxBzQbWeQ3WNdN6VwoeRHu+JNdZwWKni\naRetef/0GGDsiTHEtOv8RekkUj38JDXHZJLOHztXLtWiYXoMMJKwJ6ZFVpu0IkVbltHRCiEAq1Xq\njXUMUHs0TjHAtIk9MT27+BMAnc/CGjTUcL5c3XE0gwGmfwwxF7zecxBCOjXB5J23RtGeWAM/P6kv\nZvX+GmQtvX9GCDD2xBhi2lNTK51aYaSloBvS4dIVdcfRiBECjCTsiWlN+U9AXpG+Tm6Vo74e6NIJ\n6B6t9kgYYDrBnpheXanW/F/y3GI2A1eq1B4FA8yAGGIueL3nUFnt1UNJr/TEAKmmmlqvB3Tj98+I\nAcaemIwQu3r1KtLS0pCcnIykpCQ8++yz3hiXb7LbpVVbjdQPa9CQGFdrVXl6IwYYSWT1xKqrqxEY\nGAir1Yrhw4djxYoVGD58uLQD9sQ8p+YqcOwHxfthSxYvBIqLbrwjJhZLXnxFuSe2WoGb4oCIUOWe\nwwkGmD7JzRZZPy2BgYEAgLq6OthsNkRERLRtdOSczUvXGBYXYcmhf9/wz0uUfl4hvFfjNQww45N1\n3GK325GcnIyoqChkZGQgKSlJ6XFphld7Dnbvz2izvP2EwnshVloKpKVlGTrA2BOTORMzm83IycnB\npUuXcOeddyIrKwvp6emO+2fOnImEhAQAQFhYGJKTkx33N7zIer2dk5PjvecTAlmHsgGLBempadL9\n1xrvnrydX/nzB3rkXPtv+rX/KvF8jttCIOuf/wQiQhV/PZOS0jFqFNCrVw7S0wGTSdnn84nvT4Vv\nZ2VlYf369QDgyBM5Wn2e2EsvvYSAgAA888wz0g7YE/Ocyirg+3zle2KzH3R+OHnrL7Dk3Q3KPXF9\nvfQZlV2UbUfwENIYPHaeWFlZGX766ScAQE1NDb744gukpKS0fYR0I5MJMPQPnEnxRGGA+R6Xv/JL\nSkowY8YM2O122O12PPjggxg9erQ3xqYJ1x86K8rPD/DGpDYm1tHEz6+8jITgEMe/K8oERT/oxFmA\nefX9U4HR65PDZYgNGDAA33zzjTfGQu39pR90hdcRa3waRdbX/3L0r7wiQJmlqjkD8128dlJrTpyR\nPu5Mj0tSt0QI6WTe/+jr8YRhgBkTr53Uq6BAXa1JL5vNLn1gCAOMPIwh5oLXz8PpGODVn0SvXTsp\n7EBwR4/uUk6AGf08KqPXJwdDTGs6BkiHXkY7RDeZgCDPLU/NGRg1YE9Mi47/AFTXKvqXPK+y2wEI\nILmPRy5uZ4D5BvbE9KxrJLxzroWX2GzSCa4MMFIAQ8wFVXoOYcHSh896ocGveE+s4TdpZNvP0ncn\nwIzeMzJ6fXIwxLTIbJaWcrbZ1B5J21ltQEgQ0KFdm3bDGRg1hz0xraqtA747re/Pnmz4zMle3YHQ\nYLd3wwDzTeyJ6V37dkB0pBQCev0lYbVK4RUS5PYuGGDkCkPMBVV7DtGdgQ7tFT2sVKwnZrdLh8UJ\nMW4njycCzOg9I6PXJwdDTMvMZmk5ZwF9zcaEkII3IQZo5+/WLjgDI7nYE9ODovNA8QVplQs9/DTX\n10uHkTd3c2u8DDAC2BMzlujO0pn8Vh38tdJqBfz93D6MZIBRazHEXNBEz8FsBnolAAHtgHqrR3ft\n0Z6Y1SaNtXcPtw4jlQgwTbx/CjJ6fXIwxPTCzwL0TpDOt6qv116PzGqVTtDtnQAEtG/1wzkDI3ex\nJ6Y39VbgVL605pgWemQN54L5+QF9Etxa9JABRs7IzRaGmB7ZbEBeEVBxGTBbAItKE2q7XRpLYADQ\nM146t62VGGDUHDb2PUSTPQeLBUiMl75MAKzuH1661RNrmH3Z7UBcFJB0k2YDTJPvnwcZvT45GGJ6\nZTIBEaHAgJuB0BApVGw25XtlNrv0XAEdgH6J0l9O2/BXyBEjjuHgwXH48ccCBQZLvoCHk0YghHRo\nWVQK1NZKJ8d6sl/WcPIqIP2BoWskENWpTWfip6dfRXj473Hw4HJ069YLp0/nwE/hz9skfZGbLfyu\nMYKGWVl4CFBVA5ReBC5euvapSWapZ9bawGn4YA+7HYAJCA6Uwis0qE3hWFoKpKVlobz8MeTn94XZ\nHID/+Z/XGWDkNh5OuqCrnoPJJH3QyE1xwMDeQHwU0LGDFERWq/RVXy+dz2WTvrL+9ZX0/1bbtfus\nPx+adrh2EfqAnkCfHtI6Z20IsNOnf8LNN89GUdFDqKxcgdradAwZMgxjxozx4IvQlK7ePzcYvT45\n+OvPqPz9gK6dpS8hgNp6oOaqNFOrqrk2yxLSSakNn0IU0F4KwYAOUoB5YCXWBqWlwLBhb+HKlfOw\n248BCIbF8iYOHcrGsmWv4umnn0L79q0/v4yIPTFSXEMTPzh4AQ4ejACwoNG9pxAY+DsEB3+Ht956\nFZMnT4KJ51kQeIoFaUTj0yhSUuoAXH8qRi9UV2/F+fNr8PDDL+HWW2/DoUOH1Bgq6RRDzAWj9xyU\nrO/688CuXpVCLCBgFtq1mwvgYqOtR6Oq6hscPvwQRozIxAMPzEBRUVGbx8D3z/gYYqQIZyey1tTU\nAvgSYWH7MHVqLTp06AOTaTWA+muPsgCYjZqa7/Hxx7G4+eZbsGjRUlRXV6tWB+mAaCMP7IIM5vx5\nIfr1E2LxYiHs9p//fcKEBwUA8dFHHwshhPjuu+/E0KFjRMeOvQWwXUh/aRCNvvJEQMAvRUREnPjL\nX94TNptNpYpIDXKzhY198qiWLiW6554pKC09j+zsPY7mvRACn376KX7zm6dx8WIcqqpeBzDgur0e\nQMeO89Ctm8CaNaswbNgwb5VDKpKdLd5KS73au3ev2kNQlCfra24G1uBvf/tQnDx50ulj6+rqxBtv\nvCWCg7uI9u0fE8D562ZlNgFsFIGB8eKee+4XZ86ckTUmvn/6JTdb2BMjj5BzMfekSRPRu3dvp4/3\n9/fHU089gYKCk3jkkY7o0CEJZvNyAFevbWEGMB3V1Sexa9cAJCWlYv78hbh8+bJCFZFe8HCS2kyJ\n1ShOnz6N//zP3+HAgW9RXb0cwGRIS3Y0KEaHDs+hfftdeOWVpXj00UdgsVja/sSkGVxPjLxC6eV0\n9uzZg8cem49z54JRVbUKQOp1W3yDjh3noUuXCrzzzuu4/fbbPTsAUg1PdvUQo5+H05b6vLEe2KhR\no/D994ewatVMhIbeiw4dHgJwttEW/4Gqqizk5S3B+PG/xqhRmfj+++8d9/L9Mz6GGLnFmyuyWiwW\nPProIygs/B5PPBGPgICBsFiWAKi6toUJwERUVx/Hl1/ehpSU4fj1r5/CxYsXm98pGQYPJ6nV1F5S\nuqCgAE8+uRD/93//RHX17wH8Ck1/H19A+/YvwN//b1i69DnMmfOf8Pd370N8ST3siZEi1A6wxr76\n6is8+ug85OfbrvXLhl+3xVFYLGnYufMjRZf7IWWwJ+YhRu85tKY+LQUYAAwZMgTfffcV3nlnPiIj\npyMg4H4AeY22OIro6G6GbvYb/ftTDoYYyaK1AGtgMpkwbdpU/PjjSfzXfyUjMPAX8PdfAOA8AgMX\n4umnfw1zM+uiBQcHIz8/363nTU9Px9q1a90feDN++9vf4uWXX/b4fp1ZsmQJHnzwQa88l5IYYi6k\np6erPQRFyalPqwHWWEBAAJYseQ65ud9h8uQyWCw9MHz4f2Du3LlISEhAYGAggoODERwcjJCQEJw7\ndw6VlZVISEhw6/lMJpMi65796U9/wqJFi2RtO3PmTOzevdvt5zLKum0MMWqRHgKssejoaLz//loc\nOfJv/PWv7wCQflh37NiByspKVFZW4vLly+jatavKI1WfUXrZDDEXjN5zaKk+vQVYY/369UNkZGSL\n9ZnNZpw5cwaANKt5/PHHMW7cOISEhGDw4MGO+wDgiy++QJ8+fRAWFoY5c+ZACNFsCCxZsgSTJ0/G\nlClTEBISgltvvRXffvut4/4TJ04gPT0d4eHh6N+/P7Zv3+64b+bMmXj++ecBSO9NXFwcXn/9dURF\nRSEmJgbr168HALzzzjt4//33sXz5cgQHB2P8+PFOx/LUU0+hW7duCA0NRWpqKv75z382+3ps27YN\n/fr1Q3h4ODIyMnDy5EnHfQkJCVi5ciUGDhyIsLAwTJkyBbW1tY77X331VcTExCAuLg7vvvtuk9dW\naQwxckrPAeaMnFnH5s2bsWTJElRUVKBnz5547rnnAABlZWWYNGkSli1bhvLyciQmJmL//v0tHo5t\n27YNDzzwACoqKjBt2jRMmDABNpsN9fX1yMzMxNixY3HhwgW89dZbmD59Ok6dOgXgxsPU8+fP4/Ll\nyyguLsbatWvx+OOP49KlS3jssccwffp0TJkyBZWVldi6davTcQwaNAhHjhxxjOP+++9HXV3dDdud\nOnUK06ZNw+rVq1FWVoa7774bmZmZsFqtjnFt2bIFn332GfLy8vDtt986AnXXrl1YtWoVdu/ejdOn\nTyMrK8urh6oMMRd8sSdmpABLT0+HEAITJkxAeHg4wsPDMXHixBu2M5lMmDhxIlJTU2GxWDB9+nTk\n5OQAAHbu3In+/ftj4sSJsFgsmDt3rsvD0dTUVMf28+fPx9WrV/HVV1/h4MGDqKqqwsKFC+Hn54eM\njAyMGzcOmzZtcjy2ceD6+/tj8eLFsFgsuOuuuxAUFNTkioTu3bu3OI7p06cjPDwcZrMZ8+fPR21t\nbZPHN9i8eTPGjRuH0aNHw2Kx4JlnnkFNTQ0OHDjg2ObJJ59E165dER4ejszMTMfr87//+7+YNWsW\n+vbti4CAACxdutSrh6oMMWrCSAHWwGQyYevWraioqEBFRQX+/ve/O90uKirK8f8BAQG4cuUKAKC4\nuBhxcXFNto2Pj2/xORtvbzKZEBcXh+LiYpSUlNzw2O7du6O4uNjpfjp16tTkr6uBgYGOccmxYsUK\nJCUlISwsDOHh4bh06RLKyspu2K64uBjdunVrMub4+PgmS4Q3Du6AgABUVUlXTFxf0/WvldIYYi74\nUk/MiAHmifcvJiYGhYWFjttCiCa3nWl8v91ux9mzZxEbG+vYV+OZSkFBAWJjYx235R6KmUwmFBQU\nNHv/vn378Nprr2HLli346aefUFFRgdDQUKezpNjY2Cb7aqix8biaEx0d3aReV6+Np7kMscLCQmRk\nZKBfv37o378/Vq9e7Y1xkZcZMcBao6XDn7vvvhvHjh3DRx99BKvVitWrV+PcuXMt7u/QoUOO7d94\n4w106NABgwcPxqBBgxAYGIhXX30V9fX1yMrKwo4dOzBlyhTHOOQeikVFRTU7gwOAyspK+Pn5ITIy\nEnV1dXjxxRebXX/t/vvvxyeffII9e/agvr4eK1euRIcOHTB06NBm998wzgceeADr1q3DyZMnUV1d\njZdeeknW+D3FZYj5+/tj1apVOHbsGA4ePIi3334bJ06c8MbYNMEXemJGDrCW3r/GMx5n53013I6M\njMSWLVuwcOFCREZGIjc3F8OHX3+JU9PHjR8/Hps3b0ZERAT++te/4u9//zssFgvatWuH7du349NP\nP0Xnzp3xxBNPYMOGDejVq5fTcbQ0K3vkkUdQXl7ebJ9v7NixGDt2LHr16oWEhAQEBATccMjYsP/e\nvXtj48aNmDNnDjp37oxPPvkE27dvh5+f88/XbvzYsWPH4sknn0RGRgZ69eqFIUOGAIDXPgy51ddO\nTpgwAXPmzMHo0aOlHfDaSV0zcoCpZenSpcjNzcWGDRvUHooqTpw4gQEDBqCurq7ZqyXkUOTayfz8\nfBw+fBhpaWluD0xvjNwTKy0F0tKyDB1garx/3vylrpXvz48++gi1tbWoqKjAggULcO+997YpwFrD\n+VzRiStXrmDy5Ml48803ERQU1OS+mTNnOi7fCAsLQ3JysmMa3/Ai6/V2w5+RtTIeT91OSkpHRgbQ\nq1cO0tMBk0lb49Pz+1dQUOA41DJifc5uv/POO3j44YchhMDAgQOxZcuWVu8vKyvLce5Zay4Hk3U4\nWV9fj3HjxuGuu+7C3Llzm+6Ah5O6U1oKZGQAkycbdwZG+uex9cSEEJgxYwY6deqEVatWuf1EpA0M\nMNILj/XE9u/fj40bN2Lv3r1ISUlBSkoKdu3a5ZFB6oFWeg6e4CzAjFSfM87qa3xdnzeXvmmQkJDQ\nptUnGjP6+yeHy57Y8OHDYbfbvTEWUhBnYM796U9/8vpzKrWMjyv5+fm46aabYLVavdZ09wbjVKKQ\nhgaknrUUYEaoryWs70ZGa/8wxAyOM7CWyV36BgBqa2vxzDPPoHv37ujatSt++9vf4urVq83sGViz\nZg2SkpIQEhKCfv36Of6S2FhtbS3mzp2L2NhYxMbGYt68eY5VJsrKyjBu3DiEh4ejU6dOGDlypCOA\niouLMWnSJHTp0gU33XQT3nrrLcc+s7OzkZqaitDQUHTt2hXPPPMMAGDkyJEApDMIgoOD8a9//att\nL55GMMRc0HPPQU6A6bk+OVzVJ3fpGwBYuHAhcnNzceTIEeTm5qKoqAgvvvii0/1u2bIFS5cuxYYN\nG3D58mVs27YNERERN2z3+9//HtnZ2Thy5AiOHDmC7OxsR49u5cqViI+PR1lZGUpLS/GHP/wBJpMJ\ndrsdmZmZSElJwaZNm7B792688cYb+PzzzwFIa4jNmzcPly5dwpkzZ3D//fcDkK6lBIBLly6hsrLS\nMOd7MsQMijMw+eQsfSOEwJo1a/D6668jLCwMQUFBePbZZ/HBBx843ee7776LBQsW4NZbbwUAJCYm\nNrnkp8H777+PxYsXIzIyEpGRkXjhhRccZ/q3a9cOJSUlyM/Ph8ViwbBhwwAA//73v1FWVoZFixbB\nYrGgR48emD17tmMs7dq1w+nTp1FWVobAwEBHWBntMLIBQ8wFPfZUWhNgeqyvNVpbX3NL31y4cAHV\n1dW49dZbHeuS3XXXXU6XtQGAs2fPIjEx0eXzFRcXN1kTrFu3bo6Lun/3u9+hZ8+eGDNmDBITE7F8\n+XIA0qoXxcXFCA8Px3333Yfw8HD84Q9/QGlpKQBg7dq1OHXqFPr27YtBgwbhk08+adVroDeyz9gn\nfeAMrPXk/KUwMjISAQEBOH78OKKjo11uHx8fj9zcXJfbxcTEID8/H3379gUA/Pjjj4iJiQEABAUF\nYcWKFVixYgWOHTuGUaNG4Re/+AW6deuGHj16OFaDvV7Pnj3x/vvvAwA+/PBDTJ48GRcvXjTMB4Nc\njzMxF/TUM3InwPRUnztc1Sd36Ruz2YxHH30Uc+fOxYULFwAARUVFjj7U9WbPno0VK1bgm2++gRAC\nubm5+PHHH2/YburUqXj55ZdRVlaGsrIyvPjii46PUduxYwdyc3MhhEBISAgsFgssFgsGDRqE4OBg\nvPrqq/jss89gs9lw9OhRfP311wCAjRs3OsYYGhoKk8kEs9mMzp07w2w244cffnBZr54wxAyCMzD5\nWlqCp6XZyvLly9GzZ08MHjwYoaGhuOOOO5qdDU2ePBnPPfccpk2bhpCQEEycOBEVFRU3bLdo0SKk\npqbilltuwS233ILU1FTHR7bl5ubijjvuQHBwMIYOHYrHH38ct912G8xmM3bs2IGcnBxMmzYNnTt3\nxmOPPeZYK+yzzz5D//79ERwcjHnz5uGDDz5A+/btERgYiOeeew7Dhg1DeHg4srOz3Xr9tKbVS/Hc\nsANedqQ6BhgZkSJL8ZD2MMDI1zHEXNByz8gTAabl+jyB9RkfQ0ynOAMjkrAnpkMMMPIF7IkZFANM\n/9LT07F27Vq1h2EYDDEXtNRzUCLAtFSfElytJ6YGTy7FY/T3Tw6GmE5wBuZZnmqBWK1Wj+xHS2w2\nm9pDaBWGmAtauLZQyQDTQn1Kur6+huVoBg4ciODgYMcHWqxZswY333wzOnXqhPHjx6OkpMTp/vLz\n82E2m/HnP/8Z3bt3x+233w4A+POf/4ykpCRERERg7NixTc7O/+KLL9CnTx+EhYVhzpw5LV4lcP0y\nOk8//bTjvg0bNqB79+6IjIzEsmXLkJCQ4FiwtPGSQoA0Q4uPj3fcfuWVV9CzZ0/HskAff/yx4771\n69dj2LBhmD9/PiIjI7F06VLU1dW1atkhVYk28sAuqAXnzwuRlCTE4sVC2O1qj8YYTCaT+OGHHxy3\nd+/eLSIjI8Xhw4dFbW2tmDNnjhg5cqTTx+bl5QmTySRmzJghqqurRU1Njfj4449Fz549xcmTJ4XN\nZhMvv/zIiyi0AAALwklEQVSyGDp0qBBCiAsXLojg4GDx4YcfCqvVKlatWiX8/PzE2rVrne5/8ODB\nYuPGjUIIIaqqqsTBgweFEEIcO3ZMBAUFiX379ona2loxf/584efnJ3bv3i2EEGLmzJni+eefd+xn\n7969Ii4uznF7y5YtoqSkRAghxObNm0XHjh3FuXPnhBBCrFu3Tvj5+Yk//vGPwmaziZqaGjF37lwx\nfvx4UVFRISorK0VmZqZ49tln3Xq93SU3WxhiLuzdu1e15/ZGgKlZnzc4q+/6EJs1a5ZYsGCB4/aV\nK1eEv7+/KCgouOGxDSGWl5fn+LexY8c2CSWbzSYCAwNFQUGB+Mtf/iKGDBnSZB9xcXHNhtjIkSPF\nCy+8IC5cuNDk35cuXSqmTp3quF1VVSXatWsnVq5cKYSQQmzRokVN6m4cYtdLTk4WW7duFUJIIdat\nWzfHfXa7XXTs2LHJa3TgwAHRo0ePZvenBLnZwsNJjWIPzHtKSkqaLIfTsWNHdOrUCUVFRc0+pvGh\nWkFBAZ566inHEj2dOnUCIF0gXlJSgri4uGYfe73mltG5fj+BgYGO55HjvffeQ0pKimOMR48eRXl5\nudMxtXbZIbVxKR4X1OgZeTPAfK0n5kzDcjgNqqqqUF5ejtjY2GYf0/ivi926dcPzzz+PqVOn3rDd\n6dOnUVhY6LgthGhy+3rOltEpLy9HdHQ0Tpw44diuuroa5eXlSE5OBiAFb3V1teP+c+fOOf6/oKAA\njz32GPbs2YMhQ4bAZDIhJSWlSV+ucT2tXXZIbZyJaQxnYMqLiopqshzN1KlTsW7dOhw5cgS1tbX4\n7//+bwwePNjpSqzO/OY3v8GyZctw/PhxANLyzw1/MLj77rtx7NgxfPTRR7BarVi9enWTgLmes2V0\nLBYLJk2ahB07dmD//v2oq6vD4sWLm3wKWXJyMnbu3ImKigqcO3cOb7zxhuO+qqoqmEwmREZGwm63\nY926dTh69GizY2jtskNqY4i54M3zcNQIMKOfZ+SsviVLlmDGjBkIDw/H3/72N4wePRovvfQSJk2a\nhJiYGOTl5TW77DRw43I9EyZMwIIFCzBlyhSEhoZiwIAB+OyzzwBIs5otW7Zg4cKFiIyMRG5uLoYP\nH97svptbRqdfv354++23MW3aNMTExCAiIgJxcXGODx958MEHMXDgQCQkJGDs2LGYMmWKY5xJSUl4\n+umnMWTIEHTt2hVHjx5tMgZn5621ZtkhtfGyIxeysrK8csil1gzMW/Wpxcj19ejRA3PmzMH8+fPV\nHooi5GYLQ0wDeAhJ7ujRowfWrl2LUaNGqT0URfDaSZ1ggBG1DUPMBSV7RloIMF/siRlFXl5ek09m\n8lV8BVSihQAjMgL2xFTAACNyjT0xjWKAEXkWQ8wFT/ZUtBhgRu4ZAazPFzDEvESLAUZkBOyJeQED\njKj12BPTCAYYkbIYYi60peeghwAzek+F9RkfQ0wheggwIiNgT0wBDDCitmNPTCUMMCLvYoi50Jqe\ngx4DzOg9FdZnfAwxD9FjgBEZAXtiHsAAI/I89sS8hAFGpC6GmAst9RyMEGBG76mwPuNjiLnJCAFG\nZATsibmBAUakPPbEFMIAI9IWlyE2a9YsREVFYcCAAd4Yj+Y07jkYMcCM3lNhfcbnMsQefvhh7Nq1\nyxtj0TQjBhiREcjqieXn5yMzMxPffffdjTvwgZ4YA4zI+9gT8xAGGJG2McRaUFoKDBqUZegAM3pP\nhfUZn58ndjJz5kwkJCQAAMLCwpCcnIz09HQAP7/IerudlJSOjAygV68cpKcDJpO2xuep2zk5OZoa\nD+vz3fqysrKwfv16AHDkiRzsiTnBQ0gi9XmsJzZ16lQMHToUp06dQnx8PNatW+eRAWoVA4xIX1yG\n2KZNm1BcXIza2loUFhbi4Ycf9sa4VOEswBqmu0bF+vTN6PXJwcb+NZyBEekTr50EA4xIi3iemEwM\nMCJ98+kQkxNgRu85sD59M3p9cvhsiHEGRmQMPtkTY4ARaR97Ys1ggBEZi0+FmDsBZvSeA+vTN6PX\nJ4fPhBhnYETG5BM9MQYYkf6wJ3YNA4zI2AwdYp4IMKP3HFifvhm9PjkMG2KcgRH5BkP2xBhgRPrn\nsz0xBhiRbzFUiCkRYEbvObA+fTN6fXIYJsQ4AyPyTYboiTHAiIzHZ3piDDAi36brEPNGgBm958D6\n9M3o9cmh2xDjDIyIAJ32xBhgRMZn2J4YA4yIGtNViKkRYEbvObA+fTN6fXLoJsQ4AyMiZ3TRE2OA\nEfkew/TEGGBE1BJNh5gWAszoPQfWp29Gr08OzYaYFgKMiLRPkz0xBhgR6bYnxgAjotbQVIhpMcCM\n3nNgffpm9Prk0EyIaTHAiEj7NNETY4AR0fV00xNjgBFRW6gaYnoIMKP3HFifvhm9PjlUCzE9BBgR\naZ8qPTEGGBG5otmeGAOMiDzJqyGmxwAzes+B9emb0euTw2shpscAIyLt80pPjAFGRK2lmZ4YA4yI\nlKRoiBkhwIzec2B9+mb0+uRQLMSMEGBEpH2K9MQYYETUVqr1xBhgRORNLkNs165d6NOnD26++WYs\nX768xW2NGGBG7zmwPn0zen1ytBhiNpsNTzzxBHbt2oXjx49j06ZNOHHihNNtjRhgAJCTk6P2EBTF\n+vTN6PXJ0WKIZWdno2fPnkhISIC/vz+mTJmCrVu33rCdUQMMAH766Se1h6Ao1qdvRq9PjhZDrKio\nCPHx8Y7bcXFxKCoqumE7owYYEWlfiyFmkplIRg6w/Px8tYegKNanb0avTxbRgq+++krceeedjtvL\nli0Tr7zySpNtEhMTBQB+8Ytf/PLoV2JiYkvx5NDieWJWqxW9e/fG7t27ERMTg0GDBmHTpk3o27dv\ncw8hIvIqvxbv9PPDH//4R9x5552w2Wx45JFHGGBEpCltPmOfiEhNbTpjvzUnwurNrFmzEBUVhQED\nBqg9FEUUFhYiIyMD/fr1Q//+/bF69Wq1h+RRV69eRVpaGpKTk5GUlIRnn31W7SF5nM1mQ0pKCjIz\nM9UeisclJCTglltuQUpKCgYNGtTyxrI6Z05YrVaRmJgo8vLyRF1dnRg4cKA4fvy4u7vTnH/84x/i\nm2++Ef3791d7KIooKSkRhw8fFkIIUVlZKXr16mWo908IIaqqqoQQQtTX14u0tDSxb98+lUfkWStX\nrhTTpk0TmZmZag/F4xISEkR5ebmsbd2eick9EVavRowYgfDwcLWHoZiuXbsiOTkZABAUFIS+ffui\nuLhY5VF5VmBgIACgrq4ONpsNERERKo/Ic86ePYudO3di9uzZbf7waq2SW5fbISb3RFjSvvz8fBw+\nfBhpaWlqD8Wj7HY7kpOTERUVhYyMDCQlJak9JI+ZN28eXnvtNZjNqn/+tSJMJhNuv/12pKamYs2a\nNS1u6/YrIPdEWNK2K1euYPLkyXjzzTcRFBSk9nA8ymw2IycnB2fPnsU//vEPw1wsvWPHDnTp0gUp\nKSmGnYXt378fhw8fxqeffoq3334b+/bta3Zbt0MsNjYWhYWFjtuFhYWIi4tzd3ekgvr6ekyaNAm/\n+tWvMGHCBLWHo5jQ0FDcc889+Prrr9UeikccOHAA27ZtQ48ePTB16lTs2bMHDz30kNrD8qjo6GgA\nQOfOnXHfffchOzu72W3dDrHU1FScPn0a+fn5qKurw+bNm3Hvvfe6uzvyMiEEHnnkESQlJWHu3Llq\nD8fjysrKHBdH19TU4IsvvkBKSorKo/KMZcuWobCwEHl5efjggw8watQovPfee2oPy2Oqq6tRWVkJ\nAKiqqsLnn3/e4lkCbodY4xNhk5KS8Mtf/tJQJ8JOnToVQ4cOxalTpxAfH49169apPSSP2r9/PzZu\n3Ii9e/ciJSUFKSkp2LVrl9rD8piSkhKMGjUKycnJSEtLQ2ZmJkaPHq32sBRhtNbO+fPnMWLECMd7\nN27cOIwZM6bZ7XmyKxHpmjH/tEFEPoMhRkS6xhAjIl1jiBGRrjHEiEjXGGJEpGsMMSLSNYYYEena\n/wNMCymUEG3CjwAAAABJRU5ErkJggg==\n",
       "text": [
        "<matplotlib.figure.Figure at 0x54b8290>"
       ]
      }
     ],
     "prompt_number": 1
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "It may be geometrically obvious, but the closest point on the line occurs where the line segment from the red square to the blue line is perpedicular to the line. At this point, the pink circle just touches the blue line. This is illustrated below."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "fig, ax = subplots()\n",
      "fig.set_figheight(5)\n",
      "\n",
      "x = arange(6)\n",
      "y= matrix([[2],\n",
      "           [3]])\n",
      "ax.plot(x,x)\n",
      "ax.plot(*y,marker='o',color='r')\n",
      "ax.add_patch(patches.Circle(y,radius=1/sqrt(2.),alpha=0.75,color='pink'))\n",
      "\n",
      "v = matrix([[1],[1]])  \n",
      "Pv = v*v.T/ (v.T*v) # projection operator\n",
      "ax.plot(*(Pv*y),marker='s',color='g')\n",
      "ax.add_line( Line2D( (y[0,0], 2.5), (y[1,0],2.5) ,color='g',linestyle='--'))\n",
      "ax.add_line( Line2D( (y[0,0], 0), (y[1,0],0) ,color='r',linestyle='--'))\n",
      "ax.annotate( 'Closest point is\\nperpedicular\\nto line and tangent\\nto circle',\n",
      "              fontsize=12,xy=(2.6,2.5),\n",
      "              xytext=(3,1.5),\n",
      "              arrowprops={'facecolor':'blue'})\n",
      "\n",
      "ax.text(.7,1.5,r'$\\mathbf{y}$',fontsize=24,color='r')\n",
      "ax.set_aspect(1)\n",
      "ax.grid()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\nrQAAAABJRU5ErkJggg==\n",
       "text": [
        "<matplotlib.figure.Figure at 0x554b610>"
       ]
      }
     ],
     "prompt_number": 2
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Now that we can see what's going on, we can construct the the solution analytically. We can represent an arbitrary point along the blue line as:\n",
      "\n",
      "$$ \\mathbf{x} = \\alpha \\mathbf{v} $$ \n",
      "\n",
      "where $\\alpha$ slides the point up and down the line with\n",
      "\n",
      "$$ \\mathbf{v} = \\left[ \\begin{array}{c}\n",
      "1 \\\\\n",
      "1 \\\\\n",
      "\\end{array} \\right] $$ \n",
      "\n",
      "Formally, $ \\mathbf{v}$ is the *subspace* on which we want to *project* the  $\\mathbf{y}$. At the closest point, the vector between $\\mathbf{y}$ and $\\mathbf{x}$ (the dotted green *error* vector above) is perpedicular to the line. This means that\n",
      "\n",
      "$$ ( \\mathbf{y}-\\mathbf{x} )^T \\mathbf{v} = 0$$ \n",
      "\n",
      "and by substituting and working out the terms, we obtain \n",
      "\n",
      "$$ \\alpha = \\frac{\\mathbf{y}^T\\mathbf{v}}{|\\mathbf{v}|^2}$$\n",
      "\n",
      "The *error* is the distance between $\\alpha\\mathbf{v}$ and $ \\mathbf{y}$. Because we have a right triangle, using the Pythagorean theorem, we compute the squared length of this error as\n",
      "\n",
      "$$ \\epsilon^2 = |( \\mathbf{y}-\\mathbf{x} )|^2 = |\\mathbf{y}|^2 - \\alpha^2 |\\mathbf{v}|^2 = |\\mathbf{y}|^2 - \\frac{|\\mathbf{y}^T\\mathbf{v}|^2}{|\\mathbf{v}|^2}  $$\n",
      "\n",
      "where $ |\\mathbf{v}|^2 = \\mathbf{v}^T \\mathbf{v} $. Note that since $\\epsilon^2 \\ge 0 $, this also shows that\n",
      "\n",
      "$$ |\\mathbf{y}^T\\mathbf{v}| \\le |\\mathbf{y}|  |\\mathbf{v}|   $$ \n",
      "\n",
      "which is the famous and useful Cauchy-Schwarz inequality which we will exploit later. Finally, we can assemble all of this into the *projection* operator\n",
      "\n",
      "$$ \\mathbf{P}_v = \\frac{1}{|\\mathbf{v}|^2 } \\mathbf{v v}^T $$\n",
      "\n",
      "\n",
      "With this operator, we can take any $\\mathbf{y}$ and find the closest point on $\\mathbf{v}$ by doing\n",
      "\n",
      "$$ \\mathbf{P}_v \\mathbf{y} = \\mathbf{v} \\left( \\frac{  \\mathbf{v}^T \\mathbf{y} }{|\\mathbf{v}|^2} \\right)$$ \n",
      "\n",
      "where we recognize the term in parenthesis as the $\\alpha$ we computed earlier. It's called an *operator* because it takes a vector ($\\mathbf{y}$) and produces another vector ($\\alpha\\mathbf{v}$).\n"
     ]
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "Weighted distances"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "We can easily extend this projection operator to cases where the measure of distance between $\\mathbf{y}$ and the subspace $\\mathbf{v}$ is weighted (i.e. non-uniform). We can accomodate these weighted distances by re-writing the projection operator as\n",
      "\n",
      "$$ \\mathbf{P}_v = \\mathbf{v}\\frac{\\mathbf{v}^T \\mathbf{Q}^T}{ \\mathbf{v}^T \\mathbf{Q v} }  $$\n",
      "\n",
      "where $\\mathbf{Q}$ is positive definite matrix.  Earlier, we started with a point $\\mathbf{y}$ and inflated a circle centered at $\\mathbf{y}$ until it just touched the line defined by $\\mathbf{v}$ and this point was closest point on the line to $\\mathbf{y}$. The same thing happens in the general case with a weighted distance except now we inflate an ellipsoid, not a circle, until the ellipsoid touches the line.\n",
      "\n",
      "The code and figure below illustrate what happens using the weighted $ \\mathbf{P}_v $. It is basically the same code we used earlier. You can download the IPython notebook corresponding to this post and try different values on the diagonal of $\\mathbf{S}$ and $\\theta$ below."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "theta = 120/180.*pi   # rotation angle for ellipse\n",
      "v = matrix([[1],[1]])\n",
      "\n",
      "# rotation matrix\n",
      "U = matrix([[ cos(theta), sin(theta)],\n",
      "            [-sin(theta), cos(theta)]])\n",
      "\n",
      "# diagonal weight matrix\n",
      "S = matrix([[5,0], # change diagonals to define axes of ellipse\n",
      "            [0,1]])\n",
      "Q = U.T*S*U\n",
      "\n",
      "Pv = (v)*v.T*(Q)/(v.T*(Q)*v)      # projection operator\n",
      "err = sqrt((y-Pv*y).T*Q*(y-Pv*y)) # error length\n",
      "xhat = Pv*y                       # closest point on line\n",
      "\n",
      "fig, ax = subplots()\n",
      "fig.set_figheight(5)\n",
      "\n",
      "ax.plot(*y,marker='o',color='r')\n",
      "ax.plot(x,x)\n",
      "ax.plot(*(xhat),marker='s',color='r')\n",
      "ax.add_patch( patches.Ellipse(y,err*2/sqrt(S[0,0]),err*2/sqrt(S[1,1]),\n",
      "                                angle=theta/pi*180,color='pink',\n",
      "                                alpha=0.5))\n",
      "ax.add_line( Line2D( (y[0,0], 0), (y[1,0],0) ,color='r',linestyle='--'))\n",
      "ax.add_line( Line2D( (y[0,0],xhat[0,0]), \n",
      "                     (y[1,0],xhat[1,0]) ,\n",
      "                      color='g',linestyle='--'))\n",
      "ax.annotate( '''Closest point is\n",
      "tangent to the \n",
      "ellipse and \n",
      "\"perpendicular\" \n",
      "to the line \n",
      "in the sense of the \n",
      "weighted/rotated\n",
      "distance\n",
      "''',\n",
      "              fontsize=12,xy=(xhat[0,0],xhat[1,0]),\n",
      "              xytext=(3.5,1.5),\n",
      "              arrowprops={'facecolor':'blue'})\n",
      "\n",
      "ax.axis(xmax=6,ymax=6)\n",
      "ax.set_aspect(1)\n",
      "ax.grid()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\nhwdr1qzhvffeIzw8nCFDhvDHH38A6krzlKKmRFBISIj1Z3f3qksElRIZGVnnz9hScGgTa5JYgRDK\n2sbTqUq6hItzgwP3DhMTA1UmVhrEHzgwinbtritXSiYnJ4eNGzcCdStNU9F4CgsLCQ8PB2DgwIFs\n3bqV8+fP07FjRx5//HGgbqV5aisRVBPh4eHlendCiGp7eyBjYpKGYDYrBQfPnlfMzK1V09TsagkI\noQwnXWrOjSs7C/n++7fi7e3N66+/TmFhIWazmf/973/88ssvV0+pfnYyIyODZcuWYTQaWbt2LX/8\n8QeDBw8mIyOD9evXk5+fj4uLC56enjhdzd+rS2memkoE1aZ18ODBHD58mHXr1mEymVi2bFm5EkGO\nhkP/Rtk0VlBQBKfTIDfv2trGRsIhYmIWS60rFCqmUTg56dm4cSMHDhygbdu2BAcH88QTT5CTo6zD\nrBi8r6ln1qtXL44fP05wcDBz585l7ty5+Pv7Y7FYePvtt4mIiCAwMJBdu3bx7rvvArWX5ilLdSWC\nymqrqpQPXCsR9PzzzxMUFMSJEyfo27dvtZ+lpcfEHHrZkcFgaPyutsUCWdlK/MtZb5O4l+HHHzQ7\npFStvdgIfl4QElTlblsuJVq5ciUffPABu3btsr5nk+9KE6FV7Wq9xaFNrNEpLlFSJopKZMJqQykq\ngfDW4ONZaVdTPNi2oolJmh613iKnxxoDIZSF2ucvKblebq2aW5G2Kf3ierpV2tUUi7lrWsIjsT9k\nTKyhmEzKU3vSM6GVk1IPy8a0+JiY0QTenpXiYU1VjWLixIns3Lmz3HtajitpWbsaZE+svpSmTqRf\nVGbR3GpfLiRRiUVUKsEjy+lIqkPGxOqDEHDxkhLAb+VANb6aArNFMbF2bazpKI5sYElJSZw8eZKP\nP/6YM2fOcOONN5KTk9Og4W5CQgKRkZG8/PLLjai08ZH1xGyF2XL1Cdk5V8vkSANrVIwmCPKrt4Fd\nd911pKSkkJCQwKpVq2yv18aUNauoqChyc3MbHK9raMwvPj6eHTt2kJSUxEsvvdQgLY2BQ5tYnWMF\nRpOy5jGvoFlnH1tsTMxsUdaRXh1KNqQH1tiB+dLvirkRS2Y3FVV9z+szehJCYLFYrPfWXiY/HNrE\n6kRRsfJcxBKjjH/ZCqMJApVeWH0NrKpk1qpK62zfvt3aLjs7m8mTJxMeHk6bNm2YO3eutfRO6bHv\n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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x55e2fd0>"
       ]
      }
     ],
     "prompt_number": 3
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Note that the error vector ( $\\mathbf{y}-\\alpha\\mathbf{v}$ ) is still perpendicular to the line (subspace  $\\mathbf{v}$), but it doesn't look it because we are using a weighted distance. The difference between the first projection ( with the uniform circular distance) and the general case ( with the ellipsoidal weighted distance ) is the inner product between the two cases. For example, in the first case we have $\\mathbf{y}^T \\mathbf{v}$ and in the weighted case we have $\\mathbf{y}^T \\mathbf{Q}^T \\mathbf{v}$. To move from the uniform circular case to the weighted ellipsoidal case, all we had to do was change all of the vector inner products. This is a conceptual move we'll soon use again.\n",
      "\n",
      "Before we finished, we will need a formal property  of projections:\n",
      "\n",
      "$$ \\mathbf{P}_v \\mathbf{P}_v = \\mathbf{P}_v$$\n",
      "\n",
      "known as the *idempotent* property which basically says that once we have projected onto a subspace, further subsequent projections leave us in the same subspace."
     ]
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Summary"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "In this section, we developed the concept of a projection operator, which ties a minimization problem (closest point to a line) to an algebraic concept (inner product). It turns out that these same geometric ideas from linear algebra can be translated to the conditional expectation. How this works is the subject of our next post."
     ]
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "References"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "This post was created using the [nbconvert](https://github.com/ipython/nbconvert) utility from the source [IPython Notebook](www.ipython.org) which is available for [download](https://github.com/unpingco/Python-for-Signal-Processing/blob/master/Projection.ipynb) from the main github [site](https://github.com/unpingco/Python-for-Signal-Processing) for this blog. The projection concept is masterfully discussed in the classic Strang, G. (2003). *Introduction to linear algebra*. Wellesley Cambridge Pr. Also, some of Dr. Strang's excellent lectures are available on [MIT Courseware](http://ocw.mit.edu/courses/mathematics/18-06-linear-algebra-spring-2010/). I highly recommend these as well as the book."
     ]
    }
   ],
   "metadata": {}
  }
 ]
}